{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Node Attribute Inference (multi-class) using GraphSAGE and the Pubmed-Diabetes citation network with calibration"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This notebook demonstrates probability calibration for multi-class node attribute inference. The classifier used is GraphSAGE and the dataset is the citation network Pubmed-Diabetes. Our task is to predict the subject of a paper (the nodes in the graph) that is one of 3 classes. The data are the network structure and for each paper a 500-dimensional TF/IDF word vector.\n",
    "\n",
    "The notebook demonstrates the use of `stellargraph`'s `TemperatureCalibration` and `IsotonicCalibration` classes as well as supporting methods for calculating the Expected Calibration Error (ECE) and plotting reliability diagrams.\n",
    "\n",
    "Since the focus of this notebook is to demonstrate the calibration of `stellargraph`'s graph neural network models for classification, we do not go into detail on the training and evaluation of said models. We suggest the reader considers the following notebook for more details on how to train and evaluate a GraphSAGE model for node attribute inference,\n",
    "\n",
    "[Stellargraph example: GraphSAGE on the CORA citation network](https://github.com/stellargraph/stellargraph/blob/master/demos/node-classification-graphsage/graphsage-cora-node-classification-example.ipynb)\n",
    "\n",
    "**References**\n",
    "1. Inductive Representation Learning on Large Graphs. W.L. Hamilton, R. Ying, and J. Leskovec arXiv:1706.02216 \n",
    "[cs.SI], 2017. ([link](http://snap.stanford.edu/graphsage/))\n",
    "\n",
    "2. On Calibration of Modern Neural Networks. C. Guo, G. Pleiss, Y. Sun, and K. Q. Weinberger. \n",
    "ICML 2017. ([link](https://geoffpleiss.com/nn_calibration))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import networkx as nx\n",
    "import pandas as pd\n",
    "import os\n",
    "import itertools\n",
    "\n",
    "import stellargraph as sg\n",
    "from stellargraph.mapper import GraphSAGENodeGenerator\n",
    "from stellargraph.layer import GraphSAGE\n",
    "\n",
    "from tensorflow.keras import layers, optimizers, losses, metrics, Model\n",
    "import tensorflow as tf\n",
    "\n",
    "import numpy as np\n",
    "\n",
    "from sklearn import preprocessing, feature_extraction, model_selection\n",
    "from sklearn.calibration import calibration_curve\n",
    "from sklearn.linear_model import LogisticRegressionCV\n",
    "from sklearn.isotonic import IsotonicRegression\n",
    "\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "from stellargraph import TemperatureCalibration, IsotonicCalibration\n",
    "from stellargraph import plot_reliability_diagram, expected_calibration_error\n",
    "\n",
    "from stellargraph import datasets\n",
    "from IPython.display import display, HTML"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Given a GraphSAGE model, a node generator, and the number of predictions per point\n",
    "# this method makes n_predictions number of predictions and then returns the average\n",
    "# prediction for each query node.\n",
    "def predict(model, node_generator, n_predictions=1):\n",
    "    preds = []\n",
    "    for i in range(n_predictions):\n",
    "        preds.append(model.predict_generator(node_generator))\n",
    "    preds_ar = np.array(preds)\n",
    "    print(preds_ar.shape)\n",
    "    return np.mean(preds_ar, axis=0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Some global parameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "epochs = 20  # Numper of training epochs for GraphSAGE model.\n",
    "n_predictions = 5  # number of predictions per query node"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Loading the Pubmed-Diabetes network data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "The PubMed Diabetes dataset consists of 19717 scientific publications from PubMed database pertaining to diabetes classified into one of three classes. The citation network consists of 44338 links. Each publication in the dataset is described by a TF/IDF weighted word vector from a dictionary which consists of 500 unique words."
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "dataset = datasets.PubMedDiabetes()\n",
    "display(HTML(dataset.description))\n",
    "dataset.download()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now prepare the data so that we can create a `networkx` object that can be used by `stellargraph`."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Load the graph from edgelist"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "edgelist = pd.read_csv(\n",
    "    os.path.join(dataset.data_directory, \"Pubmed-Diabetes.DIRECTED.cites.tab\"),\n",
    "    sep=\"\\t\",\n",
    "    skiprows=2,\n",
    "    header=None,\n",
    ")\n",
    "edgelist.drop(columns=[0, 2], inplace=True)\n",
    "edgelist.columns = [\"source\", \"target\"]\n",
    "# delete unneccessary prefix\n",
    "edgelist[\"source\"] = edgelist[\"source\"].map(lambda x: x.lstrip(\"paper:\"))\n",
    "edgelist[\"target\"] = edgelist[\"target\"].map(lambda x: x.lstrip(\"paper:\"))\n",
    "edgelist[\"label\"] = \"cites\"  # set the edge type"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>source</th>\n",
       "      <th>target</th>\n",
       "      <th>label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>19127292</td>\n",
       "      <td>17363749</td>\n",
       "      <td>cites</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>19668377</td>\n",
       "      <td>17293876</td>\n",
       "      <td>cites</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1313726</td>\n",
       "      <td>3002783</td>\n",
       "      <td>cites</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>19110882</td>\n",
       "      <td>14578298</td>\n",
       "      <td>cites</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>18606979</td>\n",
       "      <td>10333910</td>\n",
       "      <td>cites</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     source    target  label\n",
       "0  19127292  17363749  cites\n",
       "1  19668377  17293876  cites\n",
       "2   1313726   3002783  cites\n",
       "3  19110882  14578298  cites\n",
       "4  18606979  10333910  cites"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "edgelist.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "Gnx = nx.from_pandas_edgelist(edgelist, edge_attr=\"label\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Load the features and subject for the nodes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "nodes_as_dict = []\n",
    "with open(os.path.join(dataset.data_directory, \"Pubmed-Diabetes.NODE.paper.tab\")) as fp:\n",
    "    for line in itertools.islice(fp, 2, None):\n",
    "        line_res = line.split(\"\\t\")\n",
    "        pid = line_res[0]\n",
    "        feat_name = [\"pid\"] + [l.split(\"=\")[0] for l in line_res[1:]][\n",
    "            :-1\n",
    "        ]  # delete summary\n",
    "        feat_value = [l.split(\"=\")[1] for l in line_res[1:]][:-1]  # delete summary\n",
    "        feat_value = [pid] + [float(x) for x in feat_value]  # change to numeric from str\n",
    "        row = dict(zip(feat_name, feat_value))\n",
    "        nodes_as_dict.append(row)\n",
    "\n",
    "# Create a Pandas dataframe holding the node data\n",
    "node_data = pd.DataFrame(nodes_as_dict)\n",
    "node_data.fillna(0, inplace=True)\n",
    "node_data[\"label\"] = node_data[\"label\"].astype(int)\n",
    "node_data[\"label\"] = node_data[\"label\"].astype(str)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>pid</th>\n",
       "      <th>label</th>\n",
       "      <th>w-rat</th>\n",
       "      <th>w-common</th>\n",
       "      <th>w-use</th>\n",
       "      <th>w-examin</th>\n",
       "      <th>w-pathogenesi</th>\n",
       "      <th>w-retinopathi</th>\n",
       "      <th>w-mous</th>\n",
       "      <th>w-studi</th>\n",
       "      <th>...</th>\n",
       "      <th>w-kidney</th>\n",
       "      <th>w-urinari</th>\n",
       "      <th>w-myocardi</th>\n",
       "      <th>w-meal</th>\n",
       "      <th>w-ica</th>\n",
       "      <th>w-locus</th>\n",
       "      <th>w-tcell</th>\n",
       "      <th>w-depress</th>\n",
       "      <th>w-bone</th>\n",
       "      <th>w-mutat</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>12187484</td>\n",
       "      <td>1</td>\n",
       "      <td>0.093935</td>\n",
       "      <td>0.028698</td>\n",
       "      <td>0.011760</td>\n",
       "      <td>0.019375</td>\n",
       "      <td>0.063161</td>\n",
       "      <td>0.170891</td>\n",
       "      <td>0.067702</td>\n",
       "      <td>0.017555</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2344352</td>\n",
       "      <td>1</td>\n",
       "      <td>0.023618</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.014784</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>14654069</td>\n",
       "      <td>1</td>\n",
       "      <td>0.102263</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.010669</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>16443886</td>\n",
       "      <td>2</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2684155</td>\n",
       "      <td>1</td>\n",
       "      <td>0.030616</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 502 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "        pid label     w-rat  w-common     w-use  w-examin  w-pathogenesi  \\\n",
       "0  12187484     1  0.093935  0.028698  0.011760  0.019375       0.063161   \n",
       "1   2344352     1  0.023618  0.000000  0.014784  0.000000       0.000000   \n",
       "2  14654069     1  0.102263  0.000000  0.010669  0.000000       0.000000   \n",
       "3  16443886     2  0.000000  0.000000  0.000000  0.000000       0.000000   \n",
       "4   2684155     1  0.030616  0.000000  0.000000  0.000000       0.000000   \n",
       "\n",
       "   w-retinopathi    w-mous   w-studi  ...  w-kidney  w-urinari  w-myocardi  \\\n",
       "0       0.170891  0.067702  0.017555  ...       0.0        0.0         0.0   \n",
       "1       0.000000  0.000000  0.000000  ...       0.0        0.0         0.0   \n",
       "2       0.000000  0.000000  0.000000  ...       0.0        0.0         0.0   \n",
       "3       0.000000  0.000000  0.000000  ...       0.0        0.0         0.0   \n",
       "4       0.000000  0.000000  0.000000  ...       0.0        0.0         0.0   \n",
       "\n",
       "   w-meal  w-ica  w-locus  w-tcell  w-depress  w-bone  w-mutat  \n",
       "0     0.0    0.0      0.0      0.0        0.0     0.0      0.0  \n",
       "1     0.0    0.0      0.0      0.0        0.0     0.0      0.0  \n",
       "2     0.0    0.0      0.0      0.0        0.0     0.0      0.0  \n",
       "3     0.0    0.0      0.0      0.0        0.0     0.0      0.0  \n",
       "4     0.0    0.0      0.0      0.0        0.0     0.0      0.0  \n",
       "\n",
       "[5 rows x 502 columns]"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "node_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'1', '2', '3'}"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "set(node_data[\"label\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "dtype('O')"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "node_data[\"pid\"].dtype"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "node_data[\"pid\"] = node_data.pid.astype(str)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>label</th>\n",
       "      <th>w-rat</th>\n",
       "      <th>w-common</th>\n",
       "      <th>w-use</th>\n",
       "      <th>w-examin</th>\n",
       "      <th>w-pathogenesi</th>\n",
       "      <th>w-retinopathi</th>\n",
       "      <th>w-mous</th>\n",
       "      <th>w-studi</th>\n",
       "      <th>w-anim</th>\n",
       "      <th>...</th>\n",
       "      <th>w-kidney</th>\n",
       "      <th>w-urinari</th>\n",
       "      <th>w-myocardi</th>\n",
       "      <th>w-meal</th>\n",
       "      <th>w-ica</th>\n",
       "      <th>w-locus</th>\n",
       "      <th>w-tcell</th>\n",
       "      <th>w-depress</th>\n",
       "      <th>w-bone</th>\n",
       "      <th>w-mutat</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>pid</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>12187484</th>\n",
       "      <td>1</td>\n",
       "      <td>0.093935</td>\n",
       "      <td>0.028698</td>\n",
       "      <td>0.011760</td>\n",
       "      <td>0.019375</td>\n",
       "      <td>0.063161</td>\n",
       "      <td>0.170891</td>\n",
       "      <td>0.067702</td>\n",
       "      <td>0.017555</td>\n",
       "      <td>0.098402</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2344352</th>\n",
       "      <td>1</td>\n",
       "      <td>0.023618</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.014784</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.030926</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14654069</th>\n",
       "      <td>1</td>\n",
       "      <td>0.102263</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.010669</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.044636</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16443886</th>\n",
       "      <td>2</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2684155</th>\n",
       "      <td>1</td>\n",
       "      <td>0.030616</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.080179</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 501 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "         label     w-rat  w-common     w-use  w-examin  w-pathogenesi  \\\n",
       "pid                                                                     \n",
       "12187484     1  0.093935  0.028698  0.011760  0.019375       0.063161   \n",
       "2344352      1  0.023618  0.000000  0.014784  0.000000       0.000000   \n",
       "14654069     1  0.102263  0.000000  0.010669  0.000000       0.000000   \n",
       "16443886     2  0.000000  0.000000  0.000000  0.000000       0.000000   \n",
       "2684155      1  0.030616  0.000000  0.000000  0.000000       0.000000   \n",
       "\n",
       "          w-retinopathi    w-mous   w-studi    w-anim  ...  w-kidney  \\\n",
       "pid                                                    ...             \n",
       "12187484       0.170891  0.067702  0.017555  0.098402  ...       0.0   \n",
       "2344352        0.000000  0.000000  0.000000  0.030926  ...       0.0   \n",
       "14654069       0.000000  0.000000  0.000000  0.044636  ...       0.0   \n",
       "16443886       0.000000  0.000000  0.000000  0.000000  ...       0.0   \n",
       "2684155        0.000000  0.000000  0.000000  0.080179  ...       0.0   \n",
       "\n",
       "          w-urinari  w-myocardi  w-meal  w-ica  w-locus  w-tcell  w-depress  \\\n",
       "pid                                                                           \n",
       "12187484        0.0         0.0     0.0    0.0      0.0      0.0        0.0   \n",
       "2344352         0.0         0.0     0.0    0.0      0.0      0.0        0.0   \n",
       "14654069        0.0         0.0     0.0    0.0      0.0      0.0        0.0   \n",
       "16443886        0.0         0.0     0.0    0.0      0.0      0.0        0.0   \n",
       "2684155         0.0         0.0     0.0    0.0      0.0      0.0        0.0   \n",
       "\n",
       "          w-bone  w-mutat  \n",
       "pid                        \n",
       "12187484     0.0      0.0  \n",
       "2344352      0.0      0.0  \n",
       "14654069     0.0      0.0  \n",
       "16443886     0.0      0.0  \n",
       "2684155      0.0      0.0  \n",
       "\n",
       "[5 rows x 501 columns]"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "node_data.index = node_data[\"pid\"]\n",
    "node_data.drop(columns=[\"pid\"], inplace=True)\n",
    "node_data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Splitting the data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For machine learning we want to take a subset of the nodes for training, and use the rest for testing. We'll use scikit-learn again to do this"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_data, test_data = model_selection.train_test_split(\n",
    "    node_data, train_size=0.75, test_size=None, stratify=node_data[\"label\"]\n",
    ")\n",
    "train_data, val_data = model_selection.train_test_split(\n",
    "    train_data, train_size=0.75, test_size=None, stratify=train_data[\"label\"]\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((11090, 501), (3697, 501), (4930, 501))"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data.shape, val_data.shape, test_data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>label</th>\n",
       "      <th>w-rat</th>\n",
       "      <th>w-common</th>\n",
       "      <th>w-use</th>\n",
       "      <th>w-examin</th>\n",
       "      <th>w-pathogenesi</th>\n",
       "      <th>w-retinopathi</th>\n",
       "      <th>w-mous</th>\n",
       "      <th>w-studi</th>\n",
       "      <th>w-anim</th>\n",
       "      <th>...</th>\n",
       "      <th>w-kidney</th>\n",
       "      <th>w-urinari</th>\n",
       "      <th>w-myocardi</th>\n",
       "      <th>w-meal</th>\n",
       "      <th>w-ica</th>\n",
       "      <th>w-locus</th>\n",
       "      <th>w-tcell</th>\n",
       "      <th>w-depress</th>\n",
       "      <th>w-bone</th>\n",
       "      <th>w-mutat</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>pid</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>10531848</th>\n",
       "      <td>3</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10593571</th>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.019526</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.009716</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2261825</th>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.010403</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.031859</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7555512</th>\n",
       "      <td>2</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18354383</th>\n",
       "      <td>3</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.012621</td>\n",
       "      <td>0.020793</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.038464</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 501 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "         label  w-rat  w-common     w-use  w-examin  w-pathogenesi  \\\n",
       "pid                                                                  \n",
       "10531848     3    0.0       0.0  0.000000  0.000000            0.0   \n",
       "10593571     2    0.0       0.0  0.019526  0.000000            0.0   \n",
       "2261825      2    0.0       0.0  0.000000  0.000000            0.0   \n",
       "7555512      2    0.0       0.0  0.000000  0.000000            0.0   \n",
       "18354383     3    0.0       0.0  0.012621  0.020793            0.0   \n",
       "\n",
       "          w-retinopathi  w-mous   w-studi  w-anim  ...  w-kidney  w-urinari  \\\n",
       "pid                                                ...                        \n",
       "10531848            0.0     0.0  0.000000     0.0  ...       0.0   0.000000   \n",
       "10593571            0.0     0.0  0.009716     0.0  ...       0.0   0.000000   \n",
       "2261825             0.0     0.0  0.010403     0.0  ...       0.0   0.031859   \n",
       "7555512             0.0     0.0  0.000000     0.0  ...       0.0   0.000000   \n",
       "18354383            0.0     0.0  0.000000     0.0  ...       0.0   0.038464   \n",
       "\n",
       "          w-myocardi  w-meal  w-ica  w-locus  w-tcell  w-depress  w-bone  \\\n",
       "pid                                                                        \n",
       "10531848         0.0     0.0    0.0      0.0      0.0        0.0     0.0   \n",
       "10593571         0.0     0.0    0.0      0.0      0.0        0.0     0.0   \n",
       "2261825          0.0     0.0    0.0      0.0      0.0        0.0     0.0   \n",
       "7555512          0.0     0.0    0.0      0.0      0.0        0.0     0.0   \n",
       "18354383         0.0     0.0    0.0      0.0      0.0        0.0     0.0   \n",
       "\n",
       "          w-mutat  \n",
       "pid                \n",
       "10531848      0.0  \n",
       "10593571      0.0  \n",
       "2261825       0.0  \n",
       "7555512       0.0  \n",
       "18354383      0.0  \n",
       "\n",
       "[5 rows x 501 columns]"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>label</th>\n",
       "      <th>w-rat</th>\n",
       "      <th>w-common</th>\n",
       "      <th>w-use</th>\n",
       "      <th>w-examin</th>\n",
       "      <th>w-pathogenesi</th>\n",
       "      <th>w-retinopathi</th>\n",
       "      <th>w-mous</th>\n",
       "      <th>w-studi</th>\n",
       "      <th>w-anim</th>\n",
       "      <th>...</th>\n",
       "      <th>w-kidney</th>\n",
       "      <th>w-urinari</th>\n",
       "      <th>w-myocardi</th>\n",
       "      <th>w-meal</th>\n",
       "      <th>w-ica</th>\n",
       "      <th>w-locus</th>\n",
       "      <th>w-tcell</th>\n",
       "      <th>w-depress</th>\n",
       "      <th>w-bone</th>\n",
       "      <th>w-mutat</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>pid</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>9589242</th>\n",
       "      <td>2</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.009582</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.055698</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12675641</th>\n",
       "      <td>2</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.012776</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.050858</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16602470</th>\n",
       "      <td>3</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.011194</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.078473</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10928773</th>\n",
       "      <td>3</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.022019</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.063993</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.010956</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12534643</th>\n",
       "      <td>2</td>\n",
       "      <td>0.009668</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.006052</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.003011</td>\n",
       "      <td>0.0</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.018445</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 501 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "         label     w-rat  w-common     w-use  w-examin  w-pathogenesi  \\\n",
       "pid                                                                     \n",
       "9589242      2  0.000000       0.0  0.009582       0.0            0.0   \n",
       "12675641     2  0.000000       0.0  0.012776       0.0            0.0   \n",
       "16602470     3  0.000000       0.0  0.000000       0.0            0.0   \n",
       "10928773     3  0.000000       0.0  0.022019       0.0            0.0   \n",
       "12534643     2  0.009668       0.0  0.006052       0.0            0.0   \n",
       "\n",
       "          w-retinopathi  w-mous   w-studi  w-anim  ...  w-kidney  w-urinari  \\\n",
       "pid                                                ...                        \n",
       "9589242        0.055698     0.0  0.000000     0.0  ...       0.0   0.000000   \n",
       "12675641       0.000000     0.0  0.050858     0.0  ...       0.0   0.000000   \n",
       "16602470       0.000000     0.0  0.011194     0.0  ...       0.0   0.000000   \n",
       "10928773       0.063993     0.0  0.010956     0.0  ...       0.0   0.000000   \n",
       "12534643       0.000000     0.0  0.003011     0.0  ...       0.0   0.018445   \n",
       "\n",
       "          w-myocardi    w-meal  w-ica  w-locus  w-tcell  w-depress  w-bone  \\\n",
       "pid                                                                          \n",
       "9589242          0.0  0.000000    0.0      0.0      0.0        0.0     0.0   \n",
       "12675641         0.0  0.000000    0.0      0.0      0.0        0.0     0.0   \n",
       "16602470         0.0  0.078473    0.0      0.0      0.0        0.0     0.0   \n",
       "10928773         0.0  0.000000    0.0      0.0      0.0        0.0     0.0   \n",
       "12534643         0.0  0.000000    0.0      0.0      0.0        0.0     0.0   \n",
       "\n",
       "          w-mutat  \n",
       "pid                \n",
       "9589242       0.0  \n",
       "12675641      0.0  \n",
       "16602470      0.0  \n",
       "10928773      0.0  \n",
       "12534643      0.0  \n",
       "\n",
       "[5 rows x 501 columns]"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "val_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>label</th>\n",
       "      <th>w-rat</th>\n",
       "      <th>w-common</th>\n",
       "      <th>w-use</th>\n",
       "      <th>w-examin</th>\n",
       "      <th>w-pathogenesi</th>\n",
       "      <th>w-retinopathi</th>\n",
       "      <th>w-mous</th>\n",
       "      <th>w-studi</th>\n",
       "      <th>w-anim</th>\n",
       "      <th>...</th>\n",
       "      <th>w-kidney</th>\n",
       "      <th>w-urinari</th>\n",
       "      <th>w-myocardi</th>\n",
       "      <th>w-meal</th>\n",
       "      <th>w-ica</th>\n",
       "      <th>w-locus</th>\n",
       "      <th>w-tcell</th>\n",
       "      <th>w-depress</th>\n",
       "      <th>w-bone</th>\n",
       "      <th>w-mutat</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>pid</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1315120</th>\n",
       "      <td>3</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.024711</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>565933</th>\n",
       "      <td>1</td>\n",
       "      <td>0.223413</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.117018</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15154932</th>\n",
       "      <td>2</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.010349</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.056643</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8104271</th>\n",
       "      <td>3</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.017398</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1951264</th>\n",
       "      <td>3</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.009625</td>\n",
       "      <td>0.020232</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 501 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "         label     w-rat  w-common     w-use  w-examin  w-pathogenesi  \\\n",
       "pid                                                                     \n",
       "1315120      3  0.000000       0.0  0.000000  0.024711            0.0   \n",
       "565933       1  0.223413       0.0  0.000000  0.000000            0.0   \n",
       "15154932     2  0.000000       0.0  0.010349  0.000000            0.0   \n",
       "8104271      3  0.000000       0.0  0.000000  0.017398            0.0   \n",
       "1951264      3  0.000000       0.0  0.000000  0.000000            0.0   \n",
       "\n",
       "          w-retinopathi  w-mous   w-studi    w-anim  ...  w-kidney  w-urinari  \\\n",
       "pid                                                  ...                        \n",
       "1315120             0.0     0.0  0.000000  0.000000  ...       0.0        0.0   \n",
       "565933              0.0     0.0  0.000000  0.117018  ...       0.0        0.0   \n",
       "15154932            0.0     0.0  0.056643  0.000000  ...       0.0        0.0   \n",
       "8104271             0.0     0.0  0.000000  0.000000  ...       0.0        0.0   \n",
       "1951264             0.0     0.0  0.009625  0.020232  ...       0.0        0.0   \n",
       "\n",
       "          w-myocardi  w-meal  w-ica  w-locus  w-tcell  w-depress  w-bone  \\\n",
       "pid                                                                        \n",
       "1315120          0.0     0.0    0.0      0.0      0.0        0.0     0.0   \n",
       "565933           0.0     0.0    0.0      0.0      0.0        0.0     0.0   \n",
       "15154932         0.0     0.0    0.0      0.0      0.0        0.0     0.0   \n",
       "8104271          0.0     0.0    0.0      0.0      0.0        0.0     0.0   \n",
       "1951264          0.0     0.0    0.0      0.0      0.0        0.0     0.0   \n",
       "\n",
       "          w-mutat  \n",
       "pid                \n",
       "1315120       0.0  \n",
       "565933        0.0  \n",
       "15154932      0.0  \n",
       "8104271       0.0  \n",
       "1951264       0.0  \n",
       "\n",
       "[5 rows x 501 columns]"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note using stratified sampling gives the following counts:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(Counter({'3': 4353, '2': 4429, '1': 2308}),\n",
       " Counter({'2': 1477, '3': 1451, '1': 769}),\n",
       " Counter({'3': 1935, '1': 1026, '2': 1969}))"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from collections import Counter\n",
    "\n",
    "Counter(train_data[\"label\"]), Counter(val_data[\"label\"]), Counter(test_data[\"label\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The training set has class imbalance that might need to be compensated, e.g., via using a weighted cross-entropy loss in model training, with class weights inversely proportional to class support. However, we will ignore the class imbalance in this example, for simplicity."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Converting to numeric arrays"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For our categorical target, we will use one-hot vectors that will be fed into a soft-max Keras layer during training. To do this conversion ..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "target_encoding = feature_extraction.DictVectorizer(sparse=False)\n",
    "\n",
    "train_targets = target_encoding.fit_transform(train_data[[\"label\"]].to_dict(\"records\"))\n",
    "val_targets = target_encoding.fit_transform(val_data[[\"label\"]].to_dict(\"records\"))\n",
    "test_targets = target_encoding.transform(test_data[[\"label\"]].to_dict(\"records\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 0., 1.],\n",
       "       [0., 1., 0.],\n",
       "       [0., 1., 0.],\n",
       "       ...,\n",
       "       [0., 1., 0.],\n",
       "       [0., 0., 1.],\n",
       "       [0., 1., 0.]])"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_targets"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We now do the same for the node attributes we want to use to predict the subject. These are the feature vectors that the Keras model will use as input. The dataset contains attributes 'w-*' that correspond to words found in that publication."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "node_features = node_data.drop(columns=[\"label\"])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>w-rat</th>\n",
       "      <th>w-common</th>\n",
       "      <th>w-use</th>\n",
       "      <th>w-examin</th>\n",
       "      <th>w-pathogenesi</th>\n",
       "      <th>w-retinopathi</th>\n",
       "      <th>w-mous</th>\n",
       "      <th>w-studi</th>\n",
       "      <th>w-anim</th>\n",
       "      <th>w-model</th>\n",
       "      <th>...</th>\n",
       "      <th>w-kidney</th>\n",
       "      <th>w-urinari</th>\n",
       "      <th>w-myocardi</th>\n",
       "      <th>w-meal</th>\n",
       "      <th>w-ica</th>\n",
       "      <th>w-locus</th>\n",
       "      <th>w-tcell</th>\n",
       "      <th>w-depress</th>\n",
       "      <th>w-bone</th>\n",
       "      <th>w-mutat</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>pid</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>12187484</th>\n",
       "      <td>0.093935</td>\n",
       "      <td>0.028698</td>\n",
       "      <td>0.011760</td>\n",
       "      <td>0.019375</td>\n",
       "      <td>0.063161</td>\n",
       "      <td>0.170891</td>\n",
       "      <td>0.067702</td>\n",
       "      <td>0.017555</td>\n",
       "      <td>0.098402</td>\n",
       "      <td>0.062691</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2344352</th>\n",
       "      <td>0.023618</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.014784</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.030926</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14654069</th>\n",
       "      <td>0.102263</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.010669</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.044636</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16443886</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.038715</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2684155</th>\n",
       "      <td>0.030616</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.080179</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 500 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "             w-rat  w-common     w-use  w-examin  w-pathogenesi  \\\n",
       "pid                                                               \n",
       "12187484  0.093935  0.028698  0.011760  0.019375       0.063161   \n",
       "2344352   0.023618  0.000000  0.014784  0.000000       0.000000   \n",
       "14654069  0.102263  0.000000  0.010669  0.000000       0.000000   \n",
       "16443886  0.000000  0.000000  0.000000  0.000000       0.000000   \n",
       "2684155   0.030616  0.000000  0.000000  0.000000       0.000000   \n",
       "\n",
       "          w-retinopathi    w-mous   w-studi    w-anim   w-model  ...  \\\n",
       "pid                                                              ...   \n",
       "12187484       0.170891  0.067702  0.017555  0.098402  0.062691  ...   \n",
       "2344352        0.000000  0.000000  0.000000  0.030926  0.000000  ...   \n",
       "14654069       0.000000  0.000000  0.000000  0.044636  0.000000  ...   \n",
       "16443886       0.000000  0.000000  0.000000  0.000000  0.038715  ...   \n",
       "2684155        0.000000  0.000000  0.000000  0.080179  0.000000  ...   \n",
       "\n",
       "          w-kidney  w-urinari  w-myocardi  w-meal  w-ica  w-locus  w-tcell  \\\n",
       "pid                                                                          \n",
       "12187484       0.0        0.0         0.0     0.0    0.0      0.0      0.0   \n",
       "2344352        0.0        0.0         0.0     0.0    0.0      0.0      0.0   \n",
       "14654069       0.0        0.0         0.0     0.0    0.0      0.0      0.0   \n",
       "16443886       0.0        0.0         0.0     0.0    0.0      0.0      0.0   \n",
       "2684155        0.0        0.0         0.0     0.0    0.0      0.0      0.0   \n",
       "\n",
       "          w-depress  w-bone  w-mutat  \n",
       "pid                                   \n",
       "12187484        0.0     0.0      0.0  \n",
       "2344352         0.0     0.0      0.0  \n",
       "14654069        0.0     0.0      0.0  \n",
       "16443886        0.0     0.0      0.0  \n",
       "2684155         0.0     0.0      0.0  \n",
       "\n",
       "[5 rows x 500 columns]"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "node_features.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Creating the GraphSAGE model in Keras"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now create a StellarGraph object from the NetworkX graph and the node features and targets. It is StellarGraph objects that we use in this library to perform machine learning tasks on."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "G = sg.StellarGraph(Gnx, node_features=node_features)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "NetworkXStellarGraph: Undirected multigraph\n",
      " Nodes: 19717, Edges: 44327\n",
      "\n",
      " Node types:\n",
      "  default: [19717]\n",
      "    Edge types: default-cites->default\n",
      "\n",
      " Edge types:\n",
      "    default-cites->default: [44327]\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(G.info())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To feed data from the graph to the Keras model we need a node generator. The node generators are specialized to the model and the learning task so we choose the `GraphSAGENodeMapper` as we are predicting node attributes with a GraphSAGE model.\n",
    "\n",
    "We need two other parameters, the `batch_size` to use for training and the number of nodes to sample at each level of the model. Here we choose a two-level model with 10 nodes sampled in the first layer, and 5 in the second."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 50\n",
    "num_samples = [10, 5]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A `GraphSAGENodeGenerator` object is required to send the node features in sampled subgraphs to Keras"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "generator = GraphSAGENodeGenerator(G, batch_size, num_samples)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For training we map only the training nodes returned from our splitter and the target values."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_gen = generator.flow(train_data.index, train_targets)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we can specify our machine learning model, we need a few more parameters for this:\n",
    "\n",
    " * the `layer_sizes` is a list of hidden feature sizes of each layer in the model. In this example we use 32-dimensional hidden node features at each layer.\n",
    " * The `bias` and `dropout` are internal parameters of the model. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "graphsage_model = GraphSAGE(\n",
    "    layer_sizes=[32, 32], generator=generator, bias=True, dropout=0.5,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we create a model to predict the 3 categories using Keras softmax layers."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_inp, x_out = graphsage_model.build()\n",
    "logits = layers.Dense(units=train_targets.shape[1], activation=\"linear\")(x_out)\n",
    "\n",
    "prediction = layers.Activation(activation=\"softmax\")(logits)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "TensorShape([None, 3])"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "prediction.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Training the model"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's create the actual Keras model with the graph inputs `x_inp` provided by the `graph_model` and outputs being the predictions from the softmax layer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = Model(inputs=x_inp, outputs=prediction)\n",
    "model.compile(\n",
    "    optimizer=optimizers.Adam(lr=0.005),\n",
    "    loss=losses.categorical_crossentropy,\n",
    "    metrics=[metrics.categorical_accuracy],\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Train the model, keeping track of its loss and accuracy on the training set, and its generalisation performance on the test set (we need to create another generator over the test data for this)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "val_gen = generator.flow(val_data.index, val_targets)\n",
    "test_gen = generator.flow(test_data.index, test_targets)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "history = model.fit_generator(\n",
    "    train_gen, epochs=epochs, validation_data=val_gen, verbose=0, shuffle=True,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "def plot_history(history):\n",
    "    metrics = sorted(history.history.keys())\n",
    "    metrics = metrics[:len(metrics)//2]\n",
    "    for m in metrics:\n",
    "        # summarize history for metric m\n",
    "        plt.plot(history.history[m])\n",
    "        plt.plot(history.history['val_' + m])\n",
    "        plt.title(m)\n",
    "        plt.ylabel(m)\n",
    "        plt.xlabel('epoch')\n",
    "        plt.legend(['train', 'test'], loc='upper right')\n",
    "        plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_history(history)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we have trained the model we can evaluate on the test set."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Test Set Metrics:\n",
      "\tloss: 0.3312\n",
      "\tcategorical_accuracy: 0.8753\n"
     ]
    }
   ],
   "source": [
    "test_metrics = model.evaluate_generator(test_gen)\n",
    "print(\"\\nTest Set Metrics:\")\n",
    "for name, val in zip(model.metrics_names, test_metrics):\n",
    "    print(\"\\t{}: {:0.4f}\".format(name, val))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Calibration Curves\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We want to determine if the classifier produces well-calibrated probabilities. Calibration curves also known as reliability diagrams are a visual method for this task. See reference [2] for a description of calibration curves also known as reliability diagrams.\n",
    "\n",
    "Diagnosis of model miscalibration should be performed on a held-out dataset that was not used for training. We are going to utilise our test set for this purpose. Equivalently, we can use our validation dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "test_nodes = test_data.index\n",
    "test_node_generator = generator.flow(test_nodes)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(5, 4930, 3)\n"
     ]
    }
   ],
   "source": [
    "# test_predictions holds the model's probabilistic output predictions\n",
    "test_predictions = predict(model, test_node_generator, n_predictions=n_predictions)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "# This produces a list of dictionaries (one entry per point in test set) and one entry\n",
    "# in the dictionary for each class label, label=1, label=2, label=3.\n",
    "y_test_pred = target_encoding.inverse_transform(test_predictions)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>label=1</th>\n",
       "      <th>label=2</th>\n",
       "      <th>label=3</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>pid</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1315120</th>\n",
       "      <td>0.000472</td>\n",
       "      <td>0.039891</td>\n",
       "      <td>0.959637</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>565933</th>\n",
       "      <td>0.984423</td>\n",
       "      <td>0.014339</td>\n",
       "      <td>0.001238</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15154932</th>\n",
       "      <td>0.005123</td>\n",
       "      <td>0.988848</td>\n",
       "      <td>0.006028</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8104271</th>\n",
       "      <td>0.002727</td>\n",
       "      <td>0.009943</td>\n",
       "      <td>0.987330</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1951264</th>\n",
       "      <td>0.000936</td>\n",
       "      <td>0.006591</td>\n",
       "      <td>0.992473</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "           label=1   label=2   label=3\n",
       "pid                                   \n",
       "1315120   0.000472  0.039891  0.959637\n",
       "565933    0.984423  0.014339  0.001238\n",
       "15154932  0.005123  0.988848  0.006028\n",
       "8104271   0.002727  0.009943  0.987330\n",
       "1951264   0.000936  0.006591  0.992473"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Convert the list of dictionaries to a dataframe so that it is easier to work with the data\n",
    "test_pred_results = pd.DataFrame(y_test_pred)\n",
    "test_pred_results.index = test_data.index\n",
    "test_pred_results.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We are going to draw one calibration curve for each column in `test_pred_results`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(4930, 3)"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_pred = test_pred_results.values\n",
    "test_pred.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [],
   "source": [
    "calibration_data = []\n",
    "for i in range(test_pred.shape[1]):  # iterate over classes\n",
    "    calibration_data.append(\n",
    "        calibration_curve(\n",
    "            y_prob=test_pred[:, i], y_true=test_targets[:, i], n_bins=10, normalize=True\n",
    "        )\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((array([0.01323944, 0.21830986, 0.24731183, 0.26829268, 0.47619048,\n",
       "         0.41935484, 0.41025641, 0.7       , 0.8671875 , 0.96092619]),\n",
       "  array([0.00681818, 0.14593289, 0.24200501, 0.35155379, 0.45476562,\n",
       "         0.54580172, 0.6462591 , 0.75735375, 0.85751155, 0.96886724])),\n",
       " tuple)"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "calibration_data[0], type(calibration_data[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Also calculate Expected Calibration Error (ECE) for each class. See reference [2] for the definition of ECE."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [],
   "source": [
    "ece = []\n",
    "for i in range(test_pred.shape[1]):\n",
    "    fraction_of_positives, mean_predicted_value = calibration_data[i]\n",
    "    ece.append(\n",
    "        expected_calibration_error(\n",
    "            prediction_probabilities=test_pred[:, i],\n",
    "            accuracy=fraction_of_positives,\n",
    "            confidence=mean_predicted_value,\n",
    "        )\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0.01425110522622315, 0.02310376441774763, 0.022436342317385723]"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ece"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Draw the reliability diagrams for each class"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x576 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_reliability_diagram(calibration_data, test_pred, ece=ece)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Temperature scaling calibration"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Temperature scaling is an extension of [Platt scaling](https://en.wikipedia.org/wiki/Platt_scaling) for calibrating multi-class classification models. It was proposed in reference [2]. \n",
    "\n",
    "Temperature scaling uses a single parameter called the `temperature` to scale a classifier's non-probabilistic outputs (logits) before the application of the softmax operator that generates the model's probabilistic outputs.\n",
    "\n",
    "$\\hat{q}_i = \\max\\limits_{k} \\sigma_{SM}(\\mathbf{z}_i/T)^{(k)}$ \n",
    "\n",
    "where $\\hat{q}_i$ is the calibrated probability for the predicted class of the i-th node; $\\mathbf{z}_i$ is the vector of logits; $T$ is the temperature; $k$ is the k-th class; and, $\\sigma_{SM}$ is the softmax function."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [],
   "source": [
    "# this model gives the model's non-probabilistic outputs required for Temperature scaling.\n",
    "score_model = Model(inputs=x_inp, outputs=logits)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Prepare the training data such that inputs are the model output logits and corresponding true class labels are the one-hot encoded.\n",
    "\n",
    "We are going to train the calibration model on the validation dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "val_nodes = val_data.index\n",
    "val_node_generator = generator.flow(val_nodes)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(5, 4930, 3)\n",
      "(5, 3697, 3)\n"
     ]
    }
   ],
   "source": [
    "test_score_predictions = predict(\n",
    "    score_model, test_node_generator, n_predictions=n_predictions\n",
    ")\n",
    "val_score_predictions = predict(\n",
    "    score_model, val_node_generator, n_predictions=n_predictions\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((4930, 3), (3697, 3))"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_score_predictions.shape, val_score_predictions.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_cal_train_all = val_score_predictions\n",
    "y_cal_train_all = val_targets"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We are going to split the above data to a training and validation set. We are going to use the former for training the calibration model and the latter for early stopping."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [],
   "source": [
    "x_cal_train, x_cal_val, y_cal_train, y_cal_val = model_selection.train_test_split(\n",
    "    x_cal_train_all, y_cal_train_all\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((2772, 3), (925, 3), (2772, 3), (925, 3))"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x_cal_train.shape, x_cal_val.shape, y_cal_train.shape, y_cal_val.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Create the calibration object"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<stellargraph.utils.calibration.TemperatureCalibration at 0x17cefc400>"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "calibration_model_temperature = TemperatureCalibration(epochs=1000)\n",
    "calibration_model_temperature"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now call the `fit` method to train the calibration model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using Early Stopping based on performance evaluated on given validation set.\n"
     ]
    }
   ],
   "source": [
    "calibration_model_temperature.fit(\n",
    "    x_train=x_cal_train, y_train=y_cal_train, x_val=x_cal_val, y_val=y_cal_val\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "calibration_model_temperature.plot_training_history()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we can take the GraphSAGE logits, scale them by `temperature` and then apply the `softmax` to obtain the calibrated probabilities for each class.\n",
    "\n",
    "**Note** that scaling the logits by `temperature` does not change the predictions so the model's accuracy will not change and there is no need to recalculate them."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(4930, 3)"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_predictions_calibrated_temperature = calibration_model_temperature.predict(\n",
    "    x=test_score_predictions\n",
    ")\n",
    "test_predictions_calibrated_temperature.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now plot the calibration curves and calculate the ECE for each class. We should expect the ECE to be lower after calibration. If not, then a different calibration method should be considered, e.g., Isotonic Regression as described later in this notebook."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [],
   "source": [
    "calibration_data_after_temperature_scaling = []\n",
    "for i in range(test_predictions_calibrated_temperature.shape[1]):  # iterate over classes\n",
    "    calibration_data_after_temperature_scaling.append(\n",
    "        calibration_curve(\n",
    "            y_prob=test_predictions_calibrated_temperature[:, i],\n",
    "            y_true=test_targets[:, i],\n",
    "            n_bins=10,\n",
    "            normalize=True,\n",
    "        )\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [],
   "source": [
    "ece_after_scaling_temperature = []\n",
    "for i in range(test_predictions_calibrated_temperature.shape[1]):\n",
    "    (\n",
    "        fraction_of_positives,\n",
    "        mean_predicted_value,\n",
    "    ) = calibration_data_after_temperature_scaling[i]\n",
    "    ece_after_scaling_temperature.append(\n",
    "        expected_calibration_error(\n",
    "            prediction_probabilities=test_predictions_calibrated_temperature[:, i],\n",
    "            accuracy=fraction_of_positives,\n",
    "            confidence=mean_predicted_value,\n",
    "        )\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0.013134620671867686, 0.020125549262947517, 0.01836949226731454]"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ece_after_scaling_temperature"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x576 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_reliability_diagram(\n",
    "    calibration_data_after_temperature_scaling,\n",
    "    test_predictions_calibrated_temperature,\n",
    "    ece=ece_after_scaling_temperature,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Isotonic Regression\n",
    "\n",
    "We extend [Isotonic calibration](https://scikit-learn.org/stable/modules/generated/sklearn.isotonic.IsotonicRegression.html#sklearn.isotonic.IsotonicRegression) to the multi-class case by calibrating OVR models, one for each class. \n",
    "\n",
    "At test time, we calibrate the predictions for each class and then normalize the vector to unit norm so that the output of the calibration is a probability distribution."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Note** that the input to the Isotonic Calibration model is the classifier's probabilistic outputs as compared to Temperature scaling where the input was the logits. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(4930, 3)"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_pred.shape  # Holds the probabilistic predictions for each query node"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(5, 3697, 3)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "(3697, 3)"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# The probabilistic predictions for the validation set\n",
    "val_predictions = predict(model, val_node_generator, n_predictions=n_predictions)\n",
    "val_predictions.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Create the calibration object of type `IsotonicCalibration`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [],
   "source": [
    "isotonic_calib = IsotonicCalibration()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now call the `fit` method to train the calibraiton model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [],
   "source": [
    "isotonic_calib.fit(x_train=val_predictions, y_train=val_targets)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(4930, 3)"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_pred_calibrated_isotonic = isotonic_calib.predict(test_pred)\n",
    "test_pred_calibrated_isotonic.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now plot the calibration curves and calculate the ECE for each class. We should expect the ECE to be lower after calibration. If not, then a different calibration method should be considered, e.g., Temperature Scaling as described earlier in this notebook."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [],
   "source": [
    "calibration_data_after_isotonic_scaling = []\n",
    "for i in range(test_pred_calibrated_isotonic.shape[1]):  # iterate over classes\n",
    "    calibration_data_after_isotonic_scaling.append(\n",
    "        calibration_curve(\n",
    "            y_prob=test_pred_calibrated_isotonic[:, i],\n",
    "            y_true=test_targets[:, i],\n",
    "            n_bins=10,\n",
    "            normalize=True,\n",
    "        )\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [],
   "source": [
    "ece_after_scaling_isotonic = []\n",
    "for i in range(test_pred_calibrated_isotonic.shape[1]):\n",
    "    fraction_of_positives, mean_predicted_value = calibration_data_after_isotonic_scaling[\n",
    "        i\n",
    "    ]\n",
    "    ece_after_scaling_isotonic.append(\n",
    "        expected_calibration_error(\n",
    "            prediction_probabilities=test_pred_calibrated_isotonic[:, i],\n",
    "            accuracy=fraction_of_positives,\n",
    "            confidence=mean_predicted_value,\n",
    "        )\n",
    "    )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[0.012991586870563645, 0.012371237054569398, 0.014407699145411835]"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ece_after_scaling_isotonic"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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IXNOs+yKiIiIiESCWr5FRERERCJE4VtEREREJEIUvkVEREREIkThW0REREQkQhS+RUREREQiROFbRERERCRCFL5FRERERCJE4VtEREREJEIUvkVEREREIkThW0REREQkQhS+RUREREQiROFbRERERCRCFL5FRERERCJE4VtEREREJEIUvkVEREREIkThW0REREQkQhS+RUREREQiROFbRERERCRCFL5FRERERCJE4VtEREREJEIUvkVEREREIkThW0REREQkQhS+RUREREQiROFbRERERCRCFL5FRERERCJE4VtEREREJEIUvkVEREREIkThW0REREQkQhS+RUREREQiROFbRERERCRCFL5FRERERCJE4VtEREREJEIUvkVEREREIkThW0REREQkQhS+RUREREQiROFbRERERCRCFL5FRERERCJE4VtEREREJEIUvkVEREREIkThW0REREQkQhS+RUREREQiROFbRERERCRCFL5FRERERCJE4VtEREREJEIUvkVEREREIkThW0REREQkQhS+RUREREQiROFbRERERCRCFL5FRERERCJE4VtEREREJEIUvkVEREREIkThW0REREQkQhS+RUREREQiJLqpC4iUzMxM171796YuQ0RERERauQULFmxxzrWta91BE767d+9OdnZ2U5chIiIiIq2cma2ub91BE76bSve7/tvUJTSZVY+f1dQliIiIiDQr6vMtIiIiIhIhavmOkIOpFfhgbu0XERER2Ru1fIuIiIiIRIjCt4iIiIhIhCh8i4iIiIhEiMK3iIiIiEiENDh8m9kJZpZUz7okMzshfGWJiIiIiLQ++9PyPQ0YWM+6fqH1IiIiIiJSj/0J37aXdbFAsJG1iIiIiIi0ansd59vMugM9aywaVkfXk3jgSmBNWCsTEREREWll9jXJzuXAg4ALPf6P3VvAXeh5JXD9gShQRERERKS12Ff4fgWYjhewp+IF7CW1tikHljnn8sNdnIiIiIhIa7LX8O2cWw2sBjCzk4CFzrnCSBQmIiIiItLa7Kvlu5pz7tMDWYiIiIiISGu3P+N8+83sQTNbamYlZhas9ag8kIWKiIiIiLR0DW75Bp7A6/P9IfAeXl9vERERERFpoP0J3xcBDzrnHjtQxbRGyQPuAmDwq3c1cSWRkzxg53dnNWUZIiIiIs3O/kyyk/T/7d1/rGRl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\n",
      "text/plain": [
       "<Figure size 864x576 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_reliability_diagram(\n",
    "    calibration_data_after_isotonic_scaling,\n",
    "    test_pred_calibrated_isotonic,\n",
    "    ece=ece_after_scaling_isotonic,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Compare ECE before and after calibration.\n",
    "\n",
    "Let's print the ECE for the original model before calibration and for the model after calibration using Temperature Scaling and Isotonic Regression.\n",
    "\n",
    "If model calibration is successful then either one or both of the calibrated models should have reduced ECE across all or most of the classes."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ECE before calibration:          0.0143, 0.0231, 0.0224\n",
      "ECE after Temperature Scaling:   0.0131, 0.0201, 0.0184\n",
      "ECE after Isotonic Calibration:  0.0130, 0.0124, 0.0144\n"
     ]
    }
   ],
   "source": [
    "cal_error = \",\".join(format(e, \" 0.4f\") for e in ece)\n",
    "print(\"ECE before calibration:         {}\".format(cal_error))\n",
    "cal_error = \",\".join(format(e, \" 0.4f\") for e in ece_after_scaling_temperature)\n",
    "print(\"ECE after Temperature Scaling:  {}\".format(cal_error))\n",
    "cal_error = \",\".join(format(e, \" 0.4f\") for e in ece_after_scaling_isotonic)\n",
    "print(\"ECE after Isotonic Calibration: {}\".format(cal_error))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Recalculate classifier accuracy before and after calibration"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_pred = np.argmax(test_pred, axis=1)\n",
    "y_pred_calibrated_temperature = np.argmax(test_predictions_calibrated_temperature, axis=1)\n",
    "y_pred_calibrated_isotonic = np.argmax(test_pred_calibrated_isotonic, axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accurace before calibration:         0.88\n",
      "Accurace after Temperature Scaling:  0.88\n",
      "Accurace after Isotonic Calibration: 0.88\n"
     ]
    }
   ],
   "source": [
    "print(\n",
    "    \"Accurace before calibration:         {:.2f}\".format(\n",
    "        accuracy_score(y_pred=y_pred, y_true=np.argmax(test_targets, axis=1))\n",
    "    )\n",
    ")\n",
    "print(\n",
    "    \"Accurace after Temperature Scaling:  {:.2f}\".format(\n",
    "        accuracy_score(\n",
    "            y_pred=y_pred_calibrated_temperature, y_true=np.argmax(test_targets, axis=1)\n",
    "        )\n",
    "    )\n",
    ")\n",
    "print(\n",
    "    \"Accurace after Isotonic Calibration: {:.2f}\".format(\n",
    "        accuracy_score(\n",
    "            y_pred=y_pred_calibrated_isotonic, y_true=np.argmax(test_targets, axis=1)\n",
    "        )\n",
    "    )\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Conclusion\n",
    "\n",
    "This notebook demonstrated how to use temperature scaling and isotonic regression to calibrate the output probabilities of a GraphSAGE model used for multi-class node attribute inference."
   ]
  }
 ],
 "metadata": {
  "file_extension": ".py",
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.10"
  },
  "mimetype": "text/x-python",
  "name": "python",
  "npconvert_exporter": "python",
  "pygments_lexer": "ipython3",
  "version": 3
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
